﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//默认从0开始，依次递增1，当然在声明枚举类型的时候也可以赋初值。
//enum Day//星期
//{
//	Mon,
//	Tues,
//	Wed,
//	Thur,
//	Fri,
//	Sat,
//	Sun
//};
//enum Sex//性别
//{
//	MALE,
//	FEMALE,
//	SECRET
//};
//enum Color//颜⾊
//{
//	RED,
//	GREEN,
//	BLUE
//};
//int main(void)
//{
//	/*
//		我们可以使⽤ #define 定义常量，为什么⾮要使⽤枚举？
//		枚举的优点：
//		1. 增加代码的可读性和可维护性
//		2. 和#define定义的标识符⽐较枚举有类型检查，更加严谨。
//		3. 便于调试，预处理阶段会删除 #define 定义的符号
//		4. 使⽤⽅便，⼀次可以定义多个常量
//		5. 枚举常量是遵循作⽤域规则的，枚举声明在函数内，只能在函数内使⽤
//	*/
//	enum Color clr = GREEN;//使⽤枚举常量给枚举变量赋值
//	//是否可以拿整数给枚举变量赋值呢？在C语⾔中是可以的，但是在C++是不⾏的，C++的类型检查⽐较严格。
//	return 0;
//}
/*
	像结构体⼀样，联合体也是由⼀个或者多个成员构成，这些成员可以不同的类型。
	但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫：共⽤体。
	给联合体其中⼀个成员赋值，其他成员的值也跟着变化。
*/
//union Un {
//	char c;
//	int i;
//};
//int main(void)
//{
//	union Un un = { 0 };
//	un.i = 0x11223344;
//	un.c = 0x55;
//	printf("%x\n", un.i);
//	printf("%p\n", &un);
//	printf("%p\n", &(un.c));
//	printf("%p\n", &(un.i));
//	printf("%zd\n", sizeof(union Un));
//	return 0;
//}
//联合的⼤⼩⾄少是最⼤成员的⼤⼩。 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候，就要对⻬到最⼤对⻬数的整数倍。
//union Un1
//{
//	char c[5];
//	int i;
//};
//union Un2
//{
//	short c[7];
//	int i;
//};
//int main()
//{
//	//下⾯输出的结果是什么？
//	printf("%zd\n", sizeof(union Un1));
//	printf("%zd\n", sizeof(union Un2));
//	return 0;
//}

//匿名只需要用到一次
//struct gift_list
//{
//	int stock_number;//库存量
//	double price; //定价
//	int item_type;//商品类型
//
//	union {
//		struct
//		{
//			char title[20];//书名
//			char author[20];//作者
//			int num_pages;//⻚数
//		}book;
//		struct
//		{
//			char design[30];//设计
//		}mug;
//		struct
//		{
//			char design[30];//设计
//			int colors;//颜⾊
//			int sizes;//尺⼨
//		}shirt;
//	}item;
//};
//写⼀个程序，判断当前机器是⼤端？还是⼩端？
int check_sys()
{
	union
	{
		int i;
		char c;
	}un;
	un.i = 1;
	return un.c;//返回1是⼩端，返回0是⼤端
}